package cn.topcodes.tcsf.admin.commons.query;

import cn.topcodes.tcsf.admin.commons.domain.IdEntity;
import cn.topcodes.tcsf.admin.commons.domain.Page;
import tk.mybatis.mapper.entity.Example;
import java.util.List;
import java.util.Map;

/**
 * IdEntity查询服务接口
 * @author unicorn
 *
 * @param <T>
 */
public interface IQueryIdEntityService<T extends IdEntity> extends IQueryService<T> {

	/**
	 * 分页组合条件查询所有标记删除实体
	 * @param searchParams	查询条件，前端可以根据灵活的规则自定义查询条件
	 * @param pageNumber	页号
	 * @param pageSize		每页条数
	 * @return				分页数据
	 */
	Page<T> findPageMarkDelete(Map<String,String[]> searchParams, int pageNumber, int pageSize);
	
	/**
	 * 分页组合条件查询所有禁用实体
	 * @param searchParams	查询条件，前端可以根据灵活的规则自定义查询条件
	 * @param pageNumber	页号
	 * @param pageSize		每页条数
	 * @return				分页数据
	 */
	Page<T> findPageDisable(Map<String,String[]> searchParams, int pageNumber, int pageSize);
	
	/**
	 * 分页组合条件查询所有启用实体
	 * @param searchParams	查询条件，前端可以根据灵活的规则自定义查询条件
	 * @param pageNumber	页号
	 * @param pageSize		每页条数
	 * @return				分页数据
	 */
	Page<T> findPageEnable(Map<String,String[]> searchParams, int pageNumber, int pageSize);
	
	/**
	 * 分页组合条件查询所有标记删除实体
	 * @param example		查询条件
	 * @param pageNumber	页号
	 * @param pageSize		每页条数
	 * @return				分页数据
	 */
	Page<T> findPageMarkDelete(Example example, int pageNumber, int pageSize);
	
	/**
	 * 分页组合条件查询所有禁用实体
	 * @param example		查询条件
	 * @param pageNumber	页号
	 * @param pageSize		每页条数
	 * @return				分页数据
	 */
	Page<T> findPageDisable(Example example, int pageNumber, int pageSize);
	
	/**
	 * 分页组合条件查询所有启用实体
	 * @param example		查询条件
	 * @param pageNumber	页号
	 * @param pageSize		每页条数
	 * @return				分页数据
	 */
	Page<T> findPageEnable(Example example, int pageNumber, int pageSize);
	
	/**
	 * 通过查询条件查询所有标记删除实体
	 * @param searchParams	查询条件，前端可以根据灵活的规则自定义查询条件
	 * @return	实体列表
	 */
	List<T> findAllMarkDelete(Map<String,String[]> searchParams);
	
	/**
	 * 通过查询条件查询所有禁用实体
	 * @param searchParams	查询条件，前端可以根据灵活的规则自定义查询条件
	 * @return	实体列表
	 */
	List<T> findAllDisable(Map<String,String[]> searchParams);
	
	/**
	 * 通过查询条件查询所有启用实体
	 * @param searchParams	查询条件，前端可以根据灵活的规则自定义查询条件
	 * @return	实体列表
	 */
	List<T> findAllEnable(Map<String,String[]> searchParams);
	
	/**
	 * 通过查询条件查询所有标记删除实体
	 * @param example	查询条件
	 * @return			实体列表
	 */
	List<T> findAllMarkDelete(Example example);
	
	/**
	 * 通过查询条件查询所有禁用实体
	 * @param example	查询条件
	 * @return			实体列表
	 */
	List<T> findAllDisable(Example example);
	
	/**
	 * 通过查询条件查询所有启用实体
	 * @param example	查询条件
	 * @return			实体列表
	 */
	List<T> findAllEnable(Example example);
	

	/**
	 * 查询所有标记删除实体
	 * @return	实体列表
	 */
	List<T> findAllMarkDelete();
	
	/**
	 * 查询所有禁用实体
	 * @return	实体列表
	 */
	List<T> findAllDisable();
	
	/**
	 * 查询所有启用实体
	 * @return	实体列表
	 */
	List<T> findAllEnable();
	

	/**
	 * 通过查询条件查询标记删除实体
	 * @param example	查询条件
	 * @return			实体对象
	 */
	T findOneMarkDelete(Example example);

	/**
	 * 通过查询条件查询标记删除实体
	 * 不存在则抛出EntityNotFoundException
	 * @param example	查询条件
	 * @return			实体对象
	 */
	T findOneMarkDeleteOrFail(Example example);
	
	/**
	 * 通过查询条件查询禁用实体
	 * @param example	查询条件
	 * @return			实体对象
	 */
	T findOneDisable(Example example);

	/**
	 * 通过查询条件查询禁用实体
	 * 不存在则抛出EntityNotFoundException
	 * @param example	查询条件
	 * @return			实体对象
	 */
	T findOneDisableOrFail(Example example);
	
	/**
	 * 通过查询条件查询启用实体
	 * @param example	查询条件
	 * @return			实体对象
	 */
	T findOneEnable(Example example);

	/**
	 * 通过查询条件查询启用实体
	 * 不存在则抛出EntityNotFoundException
	 * @param example	查询条件
	 * @return			实体对象
	 */
	T findOneEnableOrFail(Example example);

	/**
	 * 根据ID查找标记删除实体
	 * @param id	实体ID
	 * @return		实体对象
	 */
	T findOneMarkDelete(Long id);

	/**
	 * 根据ID查找标记删除实体
	 * 不存在则抛出EntityNotFoundException
	 * @param id	实体ID
	 * @return		实体对象
	 */
	T findOneMarkDeleteOrFail(Long id);
	
	/**
	 * 根据ID查找禁用实体
	 * @param id	实体ID
	 * @return		实体对象
	 */
	T findOneDisable(Long id);

	/**
	 * 根据ID查找禁用实体
	 * 不存在则抛出EntityNotFoundException
	 * @param id	实体ID
	 * @return		实体对象
	 */
	T findOneDisableOrFail(Long id);
	
	/**
	 * 根据ID查找启用实体
	 * @param id	实体ID
	 * @return		实体对象
	 */
	T findOneEnable(Long id);

	/**
	 * 根据ID查找启用实体
	 * 不存在则抛出EntityNotFoundException
	 * @param id	实体ID
	 * @return		实体对象
	 */
	T findOneEnableOrFail(Long id);
	
	/**
	 * 统计所有标记删除的记录数量
	 * @return	记录数量
	 */
	int countAllMarkDelete();
	
	/**
	 * 统计所有禁用记录数量
	 * @return	记录数量
	 */
	int countAllDisable();
	
	/**
	 * 统计所有启用记录数量
	 * @return	记录数量
	 */
	int countAllEnable();
	
	/**
	 * 条件查询统计标记删除记录数量
	 * @param example	查询条件
	 * @return	记录数量
	 */
	int countMarkDelete(Example example);
	
	/**
	 * 条件查询统计禁用记录数量
	 * @param example	查询条件
	 * @return	记录数量
	 */
	int countDisable(Example example);
	
	/**
	 * 条件查询统计启用记录数量
	 * @param example	查询条件
	 * @return	记录数量
	 */
	int countEnable(Example example);
}
